package com.gitee;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import java.util.Locale;
import java.util.ResourceBundle;

/**
 * @Description mybatisplus代码生成器
 *
 * @ClassName: MpGenerator
 */
public class MpGenerator {
  public static void main(String[] args) {
    final ResourceBundle rb = ResourceBundle.getBundle("mybatis-plus", Locale.getDefault());
    AutoGenerator ag = new AutoGenerator();
    // 全局配置
    ag.setGlobalConfig(
        new GlobalConfig()
            .setOutputDir(rb.getString("baseProjectPath") + "/src/main/java")
            .setAuthor(rb.getString("author"))
            .setEnableCache(false)
            .setFileOverride(true)
            .setBaseResultMap(true)
            .setBaseColumnList(true)
            // 自定义文件命名，注意 %s 会自动填充表实体属性！
            .setMapperName("%sMapper")
            .setXmlName("%sMapping"));
    // 数据库设置
    ag.setDataSource(
        new DataSourceConfig()
            .setDriverName(rb.getString("driverName"))
            .setUsername(rb.getString("userName"))
            .setPassword(rb.getString("password"))
            .setUrl(rb.getString("url"))
            .setDbType(DbType.MYSQL)
        );

    ag.setStrategy(
        new StrategyConfig()
            .setTablePrefix(rb.getString("tablePrefix"))
            .setNaming(NamingStrategy.underline_to_camel)
            .setInclude(rb.getString("tableName").split(","))
            // .setExclude(new String[] {rb.getString("exclude_tableName")})
            // 排除生成的表
            // 自定义实体父类
            // .setSuperEntityClass("com.baomidou.demo.TestEntity")
            // 自定义实体，公共字段
            // .setSuperEntityColumns(new String[]{"test_id"})
            // .setTableFillList(tableFillList)
            // 自定义 mapper 父类 默认BaseMapper
            // .setSuperMapperClass("com.baomidou.mybatisplus.mapper.BaseMapper")
            // 自定义 service 父类 默认IService
            // .setSuperServiceClass("com.baomidou.demo.TestService")
            // 自定义 service 实现类父类 默认ServiceImpl
            // .setSuperServiceImplClass("com.baomidou.demo.TestServiceImpl")
            // 自定义 controller 父类
            // .setSuperControllerClass("com.kichun."+packageName+".controller.AbstractController")
            // 【实体】是否生成字段常量（默认 false）
            // public static final String ID = "test_id";
            // .setEntityColumnConstant(true)
            // 【实体】是否为构建者模型（默认 false）
            // public User setName(String name) {this.name = name; return this;}
            // .setEntityBuilderModel(true)
            // 【实体】是否为lombok模型（默认 false）<a href="https://projectlombok.org/">document</a>
            .setEntityLombokModel(true)
        // Boolean类型字段是否移除is前缀处理
        // .setEntityBooleanColumnRemoveIsPrefix(true)
        // .setRestControllerStyle(true)
        // .setControllerMappingHyphenStyle(true)
        );
    // 配置相关类的包名
    ag.setPackageInfo(
        new PackageConfig()
            .setParent(rb.getString("parent"))
            .setMapper("dao")
            .setEntity("domain")
            .setXml("mapper"));
    // 自定义 xxList.jsp 生成
  /**  List<FileOutConfig> fileOutList = new ArrayList<>();
    fileOutList.add(
        new FileOutConfig("/templates/mapper.xml.ftl") {
          @Override
          public String outputFile(TableInfo tableInfo) {
            return rb.getString("baseProjectPath")
                + "/src/main/resources/mapper/"
                + tableInfo.getEntityName()
                + "Mapper"
                + ".xml";
          }
        });**/
    // 注入自定义配置
  /**  ag.setCfg(
        new InjectionConfig() {
          @Override
          public void initMap() {
            Map<String, Object> map = new HashMap<String, Object>();
            map.put("abc", this.getConfig().getGlobalConfig().getAuthor() + "-mp");
            this.setMap(map);
          }
        }.setFileOutConfigList(fileOutList));
    // 指定模板引擎 默认是VelocityTemplateEngine ，需要引入相关引擎依赖
    ag.setTemplateEngine(new FreemarkerTemplateEngine());
    ag.setTemplate(
        new TemplateConfig()
            .setXml("...")
            .setController("...")
            .setService("...")
            .setServiceImpl("..."));
**/
    // 放置自己项目的 src/main/resources/templates 目录下, 默认名称一下可以不配置，也可以自定义模板名称
  /**  TemplateConfig tc = new TemplateConfig();
    tc.setController("...");
    tc.setEntity("...");
    tc.setMapper("...");
    tc.setXml("...");
    tc.setService("...");
    tc.setServiceImpl("...");
    // 如上任何一个模块如果设置 空 OR Null 将不生成该模块。
    ag.setTemplate(tc);
**/
      ag.execute();
  }
}
